class Teacher{
    private name:string=""
    private school:string=""
    constructor(name:string,school:string){
        this.name=name
        this.school=school
    }
    show(){
        return `我是${this.school}的${this.name}`
    }
    giveLession():void{
        console.log('讲解本章目标');
        console.log('讲解具体内容');
        console.log('安排今日作业');
    }
}
class Computer extends Teacher{
    private language:string=""
    constructor(name:string,school:string,language:string){
        super(name,school) //子类的构造方法通过super()的方法调用父类构造方法，必须放在该构造方法的首行
        this.language=language
    }
    //方法重写：在继承关系中子类中的方法名称、参数的位置、个数、类型还有返回值类型相同的称为方法重写
    //方法的重写的结果：子类的方法会完全覆盖父类中的方法
    //对修饰符的要求：子类的修饰符可以和父类一样也可以比它大，但不能比它小
    //通过super.父类方法可以调用父类方法，没有特殊要求
    giveLession(): void {
        console.log(`打开开发环境,通过${this.language}进行编程`);
        super.giveLession()
    }
    writeProgram(){
        console.log(`我可以使用${this.language}进行项目开发`);
    }
}

class MusicTeacher extends Teacher{
    private type:string=""
    constructor(name:string,school:string,type:string){
        super(name,school) //子类的构造方法通过super()的方法调用父类构造方法，必须放在该构造方法的首行
        this.type=type
    }
    giveLession(): void {
        console.log(`我可以唱${this.type}类型的歌曲`);
        super.giveLession()
    }
    tangangqin(){
        console.log('我会弹钢琴');
    }
}

